import { createClient } from '@supabase/supabase-js';
import { config } from '../config';
const supabaseUrl = config.supabaseUrl;
const supabaseKey = config.supabaseKey;
const supabase = createClient(supabaseUrl, supabaseKey);

export abstract class SupabaseService<T> {
  protected abstract tableName: string;

  /**
   * 查询所有记录（可选过滤条件）
   * @param filter 过滤条件 { column: 字段名, value: 匹配值 }
   * @returns 返回符合条件的数据数组
   */
  async findAll(filter?: { column: string; value: any }): Promise<T[]> {
    let query = supabase.from(this.tableName).select('*');
    
    if (filter) {
      query = query.eq(filter.column, filter.value);
    }

    const { data, error } = await query;
    if (error) throw new Error(error.message);
    return data as T[];
  }

  /**
   * 通过ID查询单条记录
   * @param id 要查询的记录ID
   * @returns 返回匹配的单个数据对象
   * @throws 未找到记录时抛出错误
   */
  async findById(id_name:string,id: string): Promise<T> {
    const { data, error } = await supabase
      .from(this.tableName)
      .select('*')
      .eq(id_name, id)
      .single();

    if (error) throw new Error(error.message);
    return data as T;
  }

  /**
   * 创建新记录
   * @param payload 创建数据（排除id和created_at字段）
   * @returns 返回创建成功的完整数据对象
   */
  async create(payload: Omit<T, 'id' | 'created_at'>): Promise<T> {
    const { data, error } = await supabase
      .from(this.tableName)
      .insert(payload)
      .single();

    if (error) throw new Error(error.message);
    return data as T;
  }

  /**
   * 更新指定ID的记录
   * @param id 要更新的记录ID
   * @param payload 需要更新的字段（部分对象）
   * @returns 返回更新后的完整数据对象
   */
  async update(id: string, payload: Partial<T>): Promise<T> {
    const { data, error } = await supabase
      .from(this.tableName)
      .update(payload)
      .eq('id', id)
      .single();

    if (error) throw new Error(error.message);
    return data as T;
  }

  /**
   * 删除指定ID的记录
   * @param id 要删除的记录ID
   * @throws 删除失败时抛出错误
   */
  async delete(id: string): Promise<void> {
    const { error } = await supabase
      .from(this.tableName)
      .delete()
      .eq('id', id);

    if (error) throw new Error(error.message);
  }
} 